package language_basic

import "fmt"

/**
方法就是一个包含了接受者的函数，接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集
方法只是一个函数，它带有一个特殊的接收器类型，它是在func关键字和方法名之间编写的。接收器可以是struct类型或非struct类型。接收方可以在方法内部访问。
func (t Type) methodName(parameter list)(return list) {
}

method是可以继承的，如果匿名字段实现了一个method，那么包含这个匿名字段的struct也能调用该method
方法是可以继承和重写的,存在继承关系时，按照就近原则，进行调用
*/
type human struct {
	name  string
	age   int
	phone string
}

type student struct {
	human  //匿名字段
	school string
}
type Employee struct {
	human   //匿名字段
	company string
}

//Human定义method
func (h *human) SayHi() {
	fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

//Employee的method重写Human的method
func (e *Employee) SayHi() {
	fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
		e.company, e.phone) //Yes you can split into 2 lines here.
}

func Method() {
	mark := student{human{"Mark", 25, "222-222-YYYY"}, "MIT"}
	sam := Employee{human{"Sam", 45, "111-888-XXXX"}, "Golang Inc"}
	mark.SayHi()
	sam.SayHi()
}
